﻿/*
这个文件是工具类，包括以下内容
1、duilib的头文件和lib文件，需要在vs中设置duilib的include和lib的路径
2、释放对象，关闭handle,释放数组的宏
3、建立线程的宏
4、InitResource：初始化duilib的资源，里面有加载的xml的文件名字
5、字符转换的两个函数 ，多字节转换宽字符   宽字符转多字节
6、GetProgramFullPath：获取程序路径
7、InitLogSetting：初始化日志设置
上述相关函数的实现：在until.cpp中
*/
#pragma once
#include  "pch.h"
#include "easylogging++.h"//请在预处理中加上  AUTO_INITIALIZE_EASYLOGGINGPP
#include <string>

using namespace std;

//libcurl头包涵
#ifdef __USE_LIB_CURL_HEADER__
#include "curl.h"
#endif

//duilib库
#ifdef __DUII_LIB_HEADER__
//DUIlib相关头文件
#include "UIlib.h"
using namespace DuiLib;

#ifdef _DEBUG
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib_d.lib")
#   else
#       pragma comment(lib, "DuiLibA_d.lib")
#   endif
#else
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib.lib")
#   else
#       pragma comment(lib, "DuiLibA.lib")
#   endif
#endif

//初始化duilib的resource
void InitResource();

#endif // !__DUII_LIB_HEADER__



#define RELEASE(x)                      {if(x != NULL ){delete x;x=NULL;}}
// 释放句柄宏
#define RELEASE_HANDLE(x)               {if(x != NULL && x!=INVALID_HANDLE_VALUE){ CloseHandle(x);x = NULL;}}
// 释放Socket宏
#define RELEASE_SOCKET(x)               {if(x !=INVALID_SOCKET) { closesocket(x);x=INVALID_SOCKET;}}
//释放数组指针宏
#define RELEASE_ARRAY(x)                      {if(x != NULL ){delete[] x;x=NULL;}}


// _beginThreadex 代替CreateThread的宏
typedef unsigned(__stdcall* PTHREAD_START) (void*);

#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, pvParam, fdwCreate, pdwThreadID) \
((HANDLE) _beginthreadex( \
(void *) (psa), \
(unsigned) (cbStack), \
(PTHREAD_START) (pfnStartAddr),\
(void *) (pvParam),\
(unsigned) (fdwCreate), \
(unsigned *) (pdwThreadID)))


//宽字节转多字节
bool wide_char_2_multi_char(wchar_t* buf, char* str);
//多字节转宽字节
bool  multi_byte2_wide_byte(const char* _char, wchar_t* _dest_tchar);
//获取程序运行路径
void GetProgramFullPath();
//初始化日志设置
void InitLogSetting();
//多字节转宽字符
wstring	  AsciiToUnicode(const string& str);
//宽字符转多字节
string UnicodeToAscii(const wstring& wstr);
//ut8转宽字符
wstring Utf8ToUnicode(const string& str);
//宽字符转utf8
string UnicodeToUtf8(const wstring& wstr);
//多字节转utf8
string AsciiToUtf8(const string& str);
//utf8转多字节
string Utf8ToAscii(const string& str);
//转Url
struct UTF8Url
{
    static std::string Encode(const std::string& url);
    static std::string Decode(const std::string& url);

private:
    static const std::string& HEX_2_NUM_MAP();
    static const std::string& ASCII_EXCEPTION();
    static unsigned char NUM_2_HEX(const char h, const char l);
};

